// 模块系统示例
// 作者：AI助手
// 最后更新：2024年

/**
 * ES6 模块系统
 * 1. import/export 语法
 * 2. 默认导出和命名导出
 * 3. 模块作用域
 * 4. 动态导入
 */

// 1. 基本导入
// 1.1 导入默认导出和命名导出
import Calculator, { PI, add, subtract } from './math.js';
import { Logger, LogLevel } from './logger.js';

// 2. 使用导入的功能
const calc = new Calculator();
Logger.info(`PI 的值是: ${PI}`);
Logger.info(`1 + 2 = ${calc.add(1, 2)}`);
Logger.info(`5 - 3 = ${calc.subtract(5, 3)}`);
Logger.info(`4 * 6 = ${calc.multiply(4, 6)}`);

try {
    Logger.info(`10 / 2 = ${calc.divide(10, 2)}`);
    calc.divide(5, 0); // 将触发错误
} catch (error) {
    Logger.error(error.message);
}

// 3. 动态导入示例
async function loadModule() {
    try {
        // 动态导入模块
        const { default: DynamicCalculator } = await import('./math.js');
        const dynamicCalc = new DynamicCalculator();
        Logger.info(`动态导入计算：3 * 4 = ${dynamicCalc.multiply(3, 4)}`);
    } catch (error) {
        Logger.error('模块加载失败：' + error.message);
    }
}

// 4. 实际应用示例
class MathApp {
    constructor() {
        this.calculator = new Calculator();
        this.logger = Logger;
    }

    calculate(operation, a, b) {
        try {
            let result;
            switch (operation) {
                case 'add':
                    result = this.calculator.add(a, b);
                    break;
                case 'subtract':
                    result = this.calculator.subtract(a, b);
                    break;
                case 'multiply':
                    result = this.calculator.multiply(a, b);
                    break;
                case 'divide':
                    result = this.calculator.divide(a, b);
                    break;
                default:
                    throw new Error('不支持的操作');
            }
            this.logger.info(`计算结果：${a} ${operation} ${b} = ${result}`);
            return result;
        } catch (error) {
            this.logger.error(`计算错误：${error.message}`);
            throw error;
        }
    }
}

// 5. 使用示例
const app = new MathApp();
app.calculate('add', 10, 20);
app.calculate('multiply', 5, 6);

// 6. 最佳实践
// ✅ 使用命名导出提高可读性
// export { add, subtract, multiply, divide };

// ✅ 在导入时重命名避免冲突
// import { add as mathAdd } from './math.js';

// ✅ 使用动态导入进行代码分割
// if (condition) {
//     const module = await import('./feature.js');
// }

// ❌ 避免使用通配符导入
// import * as everything from './module.js';

// ❌ 避免导出可变的绑定
// export let counter = 0;

// 调用动态导入示例
loadModule(); 